package modelo.resultados;

import java.awt.Color;

public class Diagnostico {

	public static String RESULTADO_OK = "OK";
	public static String RESULTADO_BAJO = "Bajo";
	public static String RESULTADO_ALTO = "Alto";
	public static String RESULTADO_MUY_BAJO = "Muy bajo";
	public static String RESULTADO_MUY_ALTO = "Muy alto";
	
	public static int MIN_ACEPTABLE_DENSIDAD = 1028; //	g/L
	public static int MAX_ACEPTABLE_DENSIDAD = 1034; //	g/L
	
	public static double MIN_ACEPTABLE_PH = 6.5;
	public static double MAX_ACEPTABLE_PH = 6.7;
	
	public static int MIN_ACEPTABLE_COLOR = 240; 
	public static int MAX_ACEPTABLE_COLOR = 250; 
	
	public static double MIN_ACEPTABLE_GRASA = 3.7; // %total
	public static double MAX_ACEPTABLE_GRASA = 4.2; // %total

	public static String ESTADO_EXCELENTE = "EXCELENTE";
	public static String ESTADO_ACEPTABLE = "ACEPTABLE";
	public static String ESTADO_ALARMANTE = "ALARMANTE";
	
	private int densidad; 
	private Color color;
	private double ph;
	private double grasa;
	
	
	public Diagnostico(){
		this.densidad = MIN_ACEPTABLE_DENSIDAD;
		this.color = new Color(MIN_ACEPTABLE_COLOR,MIN_ACEPTABLE_COLOR,MIN_ACEPTABLE_COLOR);
		this.ph = MIN_ACEPTABLE_PH;
		this.grasa = MIN_ACEPTABLE_GRASA;
	}
	
	public Diagnostico(int densidad, double ph, double grasa, Color color){
		this.densidad = densidad;
		this.ph = ph;
		this.grasa = grasa;
		this.color = color;
	}
	
	public String evaluarDensidad(){
		if(this.densidad < MIN_ACEPTABLE_DENSIDAD)
			return RESULTADO_MUY_BAJO;
		if(this.densidad > MAX_ACEPTABLE_DENSIDAD)
			return RESULTADO_MUY_ALTO;
		if(this.densidad == MIN_ACEPTABLE_DENSIDAD)
			return RESULTADO_BAJO;
		if(this.densidad == MAX_ACEPTABLE_DENSIDAD)
			return RESULTADO_ALTO;
		return RESULTADO_OK;
	}
	
	public String evaluarPh(){
		if(this.ph < MIN_ACEPTABLE_PH)
			return RESULTADO_MUY_BAJO;
		if(this.ph > MAX_ACEPTABLE_PH)
			return RESULTADO_MUY_ALTO;
		if(this.ph == MIN_ACEPTABLE_PH)
			return RESULTADO_BAJO;
		if(this.ph == MAX_ACEPTABLE_PH)
			return RESULTADO_ALTO;
		return RESULTADO_OK;
	}
	
	public String evaluarGrasa(){
		if(this.grasa < MIN_ACEPTABLE_GRASA)
			return RESULTADO_MUY_BAJO;
		if(this.grasa > MAX_ACEPTABLE_GRASA)
			return RESULTADO_MUY_ALTO;
		if(this.grasa == MIN_ACEPTABLE_GRASA)
			return RESULTADO_BAJO;
		if(this.grasa == MAX_ACEPTABLE_GRASA)
			return RESULTADO_ALTO;
		return RESULTADO_OK;
	}
	
	public String evaluarColor(){
		if(this.color.getRed() < MIN_ACEPTABLE_COLOR || this.color.getGreen() < MIN_ACEPTABLE_COLOR || this.color.getBlue() < MIN_ACEPTABLE_COLOR)
			return RESULTADO_MUY_BAJO;
		if(this.color.getRed() > MAX_ACEPTABLE_COLOR || this.color.getGreen() > MAX_ACEPTABLE_COLOR || this.color.getBlue() > MAX_ACEPTABLE_COLOR)
			return RESULTADO_MUY_ALTO;
		return RESULTADO_OK;
	}
	
	public String evaluacionGeneral(){
		String resultado = "";
		if(this.getEstadoGeneral() == ESTADO_EXCELENTE)
			resultado = "La leche cumple con los estándares de calidad y no presenta ninguna anomalía.";
		if(this.getEstadoGeneral() == ESTADO_ACEPTABLE)
			resultado = "La leche cumple con los estándares de calidad pero presenta valores al límite de lo aconsejable.";
		if(this.getEstadoGeneral() == ESTADO_ALARMANTE)
			resultado = "La leche no cumple los estándares de calidad y no es apta para el consumo.";
		return resultado;
	}
	
	public String getEstadoGeneral(){
		String resultado = ESTADO_EXCELENTE;
		if(this.evaluarColor() != RESULTADO_OK)
			resultado = ESTADO_ALARMANTE;
		
		if(this.evaluarDensidad() != RESULTADO_OK){
			if(this.evaluarDensidad() == RESULTADO_ALTO || this.evaluarDensidad() == RESULTADO_BAJO){
				if(resultado != ESTADO_ALARMANTE)
					resultado = ESTADO_ACEPTABLE;
			}
			else{
				resultado = ESTADO_ALARMANTE;
			}
		}
		
		if(this.evaluarGrasa() != RESULTADO_OK){
			if(this.evaluarGrasa() == RESULTADO_ALTO || this.evaluarGrasa() == RESULTADO_BAJO){
				if(resultado != ESTADO_ALARMANTE)
					resultado = ESTADO_ACEPTABLE;
			}
			else{
				resultado = ESTADO_ALARMANTE;
			}
		}
		
		if(this.evaluarPh() != RESULTADO_OK){
			if(this.evaluarPh() == RESULTADO_ALTO || this.evaluarPh() == RESULTADO_BAJO){
				if(resultado != ESTADO_ALARMANTE)
					resultado = ESTADO_ACEPTABLE;
			}
			else{
				resultado = ESTADO_ALARMANTE;
			}
		}
		return resultado;
	}
	
}
